void main() {
  // 有趣的是，如果你不想限制参数的类型，你也可以只写参数名，像js一样
  // 写一个函数，可以计算从1到某个数字的累加的和
  int add(num) {
    var sum = 0;
    for (var i = 0; i <= num; i++) {
      sum += i;
    }
    return sum;
  }

  print(add(5));

  print('---------------------------');

  // 写一个函数，可以输出用户的信息，但是用户的年龄可以不传，且sex不传默认为男
  // 像这样，将必传的写出来之后，可以不传或者有默认值的，包裹在一个大括号里，语法就像下面这样就好，就不解释了，这个在dart中称为命名参数
  void printUserInfo(String username, {int? age, String sex = '男'}) {
    print('你好，用户名字为:$username , 年龄为: $age ,欢迎来到flutter中dart语法的学习');
  }

  // 调用的时候注意，必传的直接写，但是不传或者有默认值的，需要你以 参数名:值 这样的方式传过来
  printUserInfo('mikaisa', age: 20, sex: '女');

  print('---------------------------');

  // 实现一个把方法当做参数的方法
  void runner(Function fun) {
    fun();
  }

  void test() {
    print(1111);
  }

  runner(test);
  // 和js一样，你可以这样写，就像js写个回调函数在定时器里面一样的感觉
  runner(() {
    print(2222);
  });
}
